查看原文
其他

强强联合 | 用Matlab与Aspen Plus通信

Devin 化工研学社 2023-10-08


本文作者Devin,现为加拿大滑铁卢大学在读博士,研究方向为疫苗生产的建模、优化与过程控制。推荐大家去关注学长的知乎专栏:“过程系统工程学习笔记”————https://zhuanlan.zhihu.com/chemicalengineeringnotes

 

  Aspen Plus (下文简称AP)有的时候难以实现一些特殊的高级用户需求,比如多目标优化等

举个例子,买东西的时候我们都喜欢物美价廉,但是物美和价廉两个目标在现实生活中是一定程度矛盾的,这种问题在运筹学里就叫多目标优化。在工程学里,操作费用和设备费用,也是某种多目标优化问题。要实现多目标优化,我们就需要在AP中植入多目标优化的算法,对于这种封装好的软件是非常难的,除非利用一些软件已有的接口(API)。

Matlab的NSGA-II算法(一种多目标优化遗传算法)

Matlab、Python中有很多的库可以实现多目标优化算法。如果我们能把AP里建好的流程模拟当做一个函数,在Matlab、Python中调用这个函数,那么结合各种库就可以实现多目标优化了。不仅多目标优化,像自建的软测量、故障分析等都很难直接在AP中实现。更甚至,我要基于AP的流程模拟,产生大量数据,用来训练各种机器学习算法,也很难依靠手动去操作去一个一个完成;AP自带的优化、敏感性分析,也可能不能满足我的需求。为了实现这些复杂的高级需求,突破AP既有的功能,都需要与AP通信,修改AP中模拟流程的参数,然后获取搜索需要的数据。实现Matlab与Python通信,相当于打开了更大的可能性。这篇文章和另一篇文章,我将简单介绍如何利用Matlab去实现对AP的输入和输出。

AP的用户界面是一种基于ActiveX自动化的服务端。其他编程语言可以利用ActiveX技术,实现与AP的直接交互。AP的用户手册第38章节里,提供了详细的基于Visual Basic (VB)语言与AP交互。网上比较常见的资料,通常采取一种曲折的方法,通过Matlab与VB通信,然后用VB与AP通信,这样可以实现更多的功能。这种方法需要你得懂一点VB。但客观说,今天用VB的人越来越少了。

Matlab、Python其实可以直接跟AP通信,但很遗憾AP的用户手册里,没有提到如何利用Matlab和Python进行交互,网上资料也是非常非常少。不过用户手册里依然有很多有用的信息值得参考,如有疑问请参考用户手册。


步骤概述

1.在AP中构建好流程模拟,运行成功后,保存成bkp文件格式。

2.确定输入变量和输出变量的变量名,并在AP的变量浏览器(Variable Explorer)中查找到相应变量的调用地址(Call)。

3.在Matlab的程序中根据需要,利用调用地址(call)改变输入变量、获取输出变量。

4.检查该次运算中,AP是否存在你认为严重的警告(Warning)或者错误(Error),从而在Matlab中取舍某些结果。


详细步骤

1.构建模型
为了方便解说和读者实验,这里将用AP自带的三效蒸发的例子来解说。在AP的默认安装目录下,找到用户图形界面(GUI)文件夹下的案例(Examples)文件夹,里面是各种Aspen公司构建的各行业的经典案例。在其中找到大宗化学品(Bulk Chemical)文件夹,其中有一个Triple-Effect Evaporator.bkp文件(即三效蒸发器),同名的pdf是该模型的背景介绍。下文讲通过Matlab操作这个三效蒸发器文件,所以可以拷贝到其他文件夹,以供实验。(读者可以根据自己的需要在AP中构建、调试自己的流程模拟过程。)
三效蒸发器文件的目录
2.运行调试,确保可以正常运行。
三效蒸发器的流程图

3.从结果汇总(Results Summary)的运行状态(Run status)中,确定软件版本。AP第10版对应的是36.0,11版对应37.0,以此类推。这个信息在程序里面会用到

确定AP的版本

4.确定输入变量和输出变量。在这个项目中, 输入变量是进料总流量,输出变量是蒸发器的热负荷,如下图黄色标记所示。我将用Matlab修改输入流量1000为1200、1400,然后用Matlab获取,运行AP的模拟后,三个蒸发器相应的热负荷。

5.单击鼠标左键进料流股BRINE的对话框。在总流量一栏,选定这个变量,单击右键复制这个变量。

6.复制变量后,选择自定义(Customize)的标签页。在设置(Settings)下,找到变量浏览器(Variable Explorer)。

7.进入变量浏览器,在空白处鼠标单击右键,选择“去节点(Go to Node)”。(注:这里的Node是指AP的各种对象。在AP中,各种数据、各种参数,都是在面向对象编程的思想,组织起来的复杂数据结构。这种数据结构是树状的,每一个分叉都可以看做一个节点,节点上又有各种子节点。详细内容请查看AP的用户手册第38章。)

8.弹出一个对话框,点击确定(OK)。

9.在TOTFLOW下面找到混合(MIXED)一项,即为混合物的进料总流量的节点。下图右侧显示了这个节点的各种属性(Attribute)和相应的属性值(Value)。其中有两个最重要,一个是Call(变量的调用地址),另一个是Value(变量值)。Call就是在Matlab中,要调用这个变量时的调用地址,Value就是目前这个变量的值,此时流量是1000。

10.类似上面的操作,我们可以找到输出变量,即三个蒸发器的热负荷的Call和Value。

11.运行Matlab程序,分别修改流量为1200、1400。
流量为1200时
流量为1400时

12.Matlab运行中,我的电脑上流量为1200时会报错,不收敛。原因是温度超过Solver默认的上限,修改默认的上限会收敛。但有趣的是,继续进行流量为1400的计算时,能收敛不报错。我推测,原因是1400的迭代计算中应该没有触碰到上限,所以1400的能收敛,反倒1200的不能收敛。

既然AP计算时,会有各种的错误(Error)和警告(Warning),有的计算结果是不可靠,Matlab运行程序时,就需要处理这些复杂情况,取舍某些结果。实现的方法是检查历史文件(his),历史文件存储了所有输入变量和计算细节,所有的警告和错误都会被记录下来。需要注意历史文件是临时文件,历史文件的名字会变,每次计算可能都不一样。这个历史文件的名字变量是运行ID(Run ID),其Call为Application.Tree.FindNode("\Data\Results Summary\Run-Status\Output\RUNID")。利用这个Call,可以在Matlab中以文本格式读取历史文件,搜索报错和警告信息。

计算中产生的各种临时文件,后缀为his的是历史文件

这里用记事本文件格式,展示下历史文件的内容。可以看到运行流量为1200的模拟时,AP有一个严重错误(Severe Error),原因是温度超过上限。所以这一次的计算结果不可靠。Matlab需要去搜索“Severe Error”这个关键词。如果有这个关键词,可以在Matlab中,通过条件语句,丢弃这次的模拟结果。(注:关键词的确定, 需要在前期的实验中,摸索尝试,确定可能会出现的各种报错、警告情况)


Matlab程序

计算过程中,可以在Matlab中使用断点,来暂停程序的运行;此时可以检查AP的运行,是否一切正常。需要注意,整个计算过程中有点容易死机,需要有耐心。

下面的Matlab程序,进行了详细的注释

clear;
clc;

%% 连接Aspen Plus

% AP8.8版替换下面的36.0为34.0; 9.0替换为35.0; 10.0替换为36.0;11.0替换为37.0
% 创建AP的本地服务器
Application = actxserver('Apwn.Document.36.0');

% 获取当前文件夹的地址,三效蒸发器文件和本程序文件需放置在同一个文件夹
[~,address] = fileattrib;

% AP的bkp文件的文件名,即三效蒸发器bkp文件的文件名
SimulationName = 'Triple-Effect Evaporator';

%打开三效蒸发器文件
Application.invoke('InitFromArchive2',[address.Name '\' SimulationName '.bkp']);

% 设置AP用户界面的可见性,1为可见,0为不可见
Application.Visible = 1;

% 压制对话框的弹出,1为压制;0为不压制
Application.SuppressDialogs = 1;

% 试运行三效蒸发器模拟
Application.Engine.Run2(1);

% 因为AP运行比较慢,所以用一个循环语句,每两秒钟检查一次是否运行完毕
while Application.Engine.IsRunning == 1
pause(2);
end

% 定义输入、输出变量、收敛标签
FeedFlow = [1200 1400];
HeatDuty = zeros(2,3);
SimulationConvergency = zeros(2,1);


%% 程序核心部分

% 用for循环依次改变流量为1200、1400,并运行模拟,然后存储数据,检查历史文件
for ii = 1:length(FeedFlow)

%设置输入流量
Application.Tree.FindNode("\Data\Streams\BRINE\Input\TOTFLOW\MIXED").Value = FeedFlow(ii);

%初始化,用于清除之前的数据
Application.Reinit;

%运行程序
Application.Engine.Run2(1);

%每两秒钟检查一次是否运行完毕
while Application.Engine.IsRunning == 1
pause(2);
end

%获取三个蒸发器的热负荷
HeatDuty(ii,1) = Application.Tree.FindNode("\Data\Blocks\STAGE-1\Output\QCALC").Value;
HeatDuty(ii,2) = Application.Tree.FindNode("\Data\Blocks\STAGE-2\Output\QCALC").Value;
HeatDuty(ii,3) = Application.Tree.FindNode("\Data\Blocks\STAGE-3\Output\QCALC").Value;

%获取历史文件的名字
name = Application.Tree.FindNode("\Data\Results Summary\Run-Status\Output\RUNID").Value;
Filename = [address.Name,'\',name,'.his'];
fid = fopen(Filename,'r');

%读取历史文件信息,并存储在Data中
Data = textscan(fid,'%s','delimiter','\n','whitespace',' ');
fclose('all');
contents = Data{1};

%定义搜索关键词
SearchingString = 'SEVERE ERROR';
isStringExist = strfind (contents, SearchingString );

%检查关键词是否出现
isError = find(~ cellfun ('isempty', isStringExist),1);

%如果关键词出现,则标记这一次结果为没有收敛
if isempty(isError)
SimulationConvergency(ii) = true;
else
SimulationConvergency(ii) = false;
end

end


%% 关闭AP
Application.Close;
Application.Quit;

(可滑动查看)


参考文献

Aspen Plus User Guide

Andrés F. Abril,MathWorks FileExchange, Aspen Plus - Matlab Link




END



(文章已获作者Devin的转载许可‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍,点击下方阅读原文即可关注学长的知乎和过程系统工程专栏哦!)


往期精选(点击即可跳转)


天津大学膜分离技术助力破解“温室效应”!

中国石油大学张霖宙课题组 | 基于结构单元与键电矩阵(SU-BEM)混合框架的分子尺度反应动力学模型构建

中国化工学会重磅推出“侯德榜公益大讲堂”

AspenONE V12来啦:化工+AI?

Aspen Plus:二元/三元相图的绘制

学习Aspen,不会用Help功能是不行的!

2020软科世界大学学术排名,化工类高校表现如何

别只会用MathType了,LaTeX太香了!

ChemDraw用不了,分子绘图软件MarvinSketch才是你的首选!

这些好看的化学化工图形是如何绘制的?
创作:Devin整理:yeti
化工设计Club交流QQ群(群号:881289423)
化工设计微信群请加小编微信:hgsheji,拉你进群

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存